第
2
章
Nginx
进阶
2.1 Nginx
快速入门
学习目标:
应用
nginx
环境部署
记住
nginx
配置结构及其访问原理
应用
server
配置段常见配置项
应用
location
配置格式
了解
location
配置规则的优先级
2.1.1 Nginx
简介
Nginx(
发音同
engine x)
是一款基于
异步框架
的轻量级
/
高性能的
Web
服务器
/
反向代理
服务器
/
缓存
服务器
/
电子邮件
(IMAP/POP3)
代理服务器,并在一个
BSD-like
协议下发行。由俄罗斯的程序设计师
Igor Sysoev(
伊戈尔·赛索耶夫
)
所开发,最初供俄国大型网站
Rambler.ru
及搜寻引擎
Rambler
使用。
Nginx
特点
优点:
高并发量:基于
epoll/kqueue
模型开发,支持高并发量,官方说其支持高达
5w
并发连接数的响应
内存消耗少:善于处理静态文件,相较于其他
web(
比如:
apache),
占用更少的内存及资源
简单稳定:配置简单
(
一个
conf
文件
),
运行简单
(nginx
命令
)
,而且运行稳定
模块化程度高:功能模块插件化设计,可以自由配置相应的功能。
支持
Rwrite
重写规则:能够根据域名、
URL
等请求关键点,实现定制化的高质量分发。
低成本:
Nginx
的负载均衡功能很强大而且免费开源,相较于几十万的硬件负载均衡器成本相当低。
支持多系统:
Nginx
代码完全用
C
语言从头写成,可以在各系统上编译并使用。
缺点:
动态处理差:
nginx
善于处理静态文件,但是处理动态页面相较于
Apache
之类重量级的
web
软件能力稍欠缺。
rewrite
弱:虽然
nginx
支持
rewrite
功能多,但是相较于
Apache
之类重量级的
web
软件能力稍欠缺。
2.1.2 Nginx
部署
Nginx
软件部署
安装
Nginx
软件
方法一:快
apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-dev
apt-get install nginx -y
方法二:定制标准高
编译安装,请关注后续
"shell
自动化运维
"
课程
检查效果:
netstat -tnulp | grep nginx
浏览器查看
服务相关命令
systemctl start|stop|reload|... nginx
/etc/init.d/nginx start|stop|reload|...
/usr/sbin/nginx ...
nginx -V
nginx
服务相关命令
nginx -V
nginx -v
nginx -s stop
nginx -s reload
nginx -t 检查默认配置文件
nginx -t -c file.conf 指定配置文件进行检查
移除相关命令:
# 查看和nginx相关软件
dpkg --get-selections|grep nginx
# 移除nginx,包括相关文件
apt-get --purge remove nginx
apt-get --purge remove nginx-common
apt-get --purge remove nginx-core
Nginx配置简介
nginx软件目录:
工作目录:/etc/nginx
执行文件: /usr/sbin/nginx
日志目录:/var/log/nginx
启动文件:/etc/init.d/nginx
web目录:/var/www/html/,首页文件是index.nginx-debian.html
/usr/share/nginx/html/ 首页文件是index.html
nginx配置文件:
默认文件:
/etc/nginx/nginx.conf
其他目录:
/etc/nginx/{sites-available/sites-enabled/conf.d}
文件结构:
全局配置段
http配置段
server配置段 项目或者应用
location配置段 url配置
2.1.3
配置详解
全局配置段
主要是全局性的和服务级别的属性配置,常见的主要有以下几种设置:
user 设置使用用户(worker)
worker_processes 进行增大并发连接数的处理 跟cpu保持一致 八核设置八个
error_log nginx的错误日志
pid nginx服务启动时候pid
events 定义事件相关的属性
worker_connections 一个进程允许处理的最大连接数
use 定义使用的内核模型
http
配置段
主要配置
server
通用的一些配置
include mime.types; # 文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型
sendfile on; # 开启高效文件传输模式。
autoindex on; # 开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; # 防止网络阻塞
tcp_nodelay on; # 防止网络阻塞
keepalive_timeout 120; # 长连接超时时间,单位是秒
gzip on; # 开启gzip压缩输出
Server
常见配置属性
常见样式
server {
listen 端口;
server_name 主机名;
...
}
server
配置段最重要的属性是
listen
和
server_name
。它们都是用于匹配并处理请求的。
listen
属性
作用:定义
Server
监听的
ip
和
port
,当
ip/port
匹配时候才进行下一步匹配
表现形式:
形式
|
描述
|
示例
|
完整示例
|
IP:Port
|
地址精确表示样式
|
listen 10.10.10.10:99
|
listen 10.10.10.10:99
|
IP
|
自动监听
IP:80
地址
|
listen 10.10.10.10
|
listen 10.10.10.10:80
|
Port
|
自动监听
全地址
:Port
|
listen 99
或
[::]:99
|
listen 0.0.0.0:99
|
default_server
|
自动使用默认的地址
|
listen default_server
|
listen localhost:80
|
使用原则:
首先将所有样式补全成
IP:Port,
然后匹配
,
匹配
Server
多,那么接着使用
Server_name
匹配
server_name
属性
作用:定义
Server
监听的域名,当域名匹配时候才进行下一步操作
表现形式:
格式
|
完整样式
|
前缀正则样式
|
后缀正则样式
|
禁止非法域名或
IP
|
形式
|
|
|
|
_
|
使用原则:
优先使用完整样式
,
然后使用前缀正则样式
,
最后使用后缀正则样式
,
如果正则样式相同的时候
,
匹配最长
,
否则就走非法规则。
非法域名
/IP
,表示请求到该主机上一个不存在的
IP
或者域名
root
属性
作用:定义
Server
相应请求的
html
文件所在路径
表现形式:
root /var/www/html;
index
属性
作用:定义响应请求后返回的文件名称或格式
表现形式:
index index.html index.htm index.nginx-debian.html;
return
属性
作用:定义响应请求后返回的
http
状态码
表现形式:
return 444;
location
常见配置属性
location
主要是根据
Server
匹配到的请求路径和关键字去响应和处理。
语法:
location optional_modifier location_match { ... }
location @name { ... }
其中:
optional_modifier
是匹配条件,
location_match
是匹配的样式,
{}
是要执行的操作。匹配条件主要有两种
:
正则
/
前缀字符。
匹配规则
正则匹配
类型
|
含义
|
匹配方式
|
优先级
|
样式
|
~|!~
|
普通正则
-
敏感
|
不敏感
|
正则符号
|
3
|
location ~ .(jpe?g)$ {}
|
~*|!~*
|
普通正则
-
不敏感
|
敏感
|
正则符号
|
3
|
location ~* .(jpe?g)$ {}
|
普通匹配
类型
|
含义
|
匹配方式
|
优先级
|
样式
|
=/路径
|
精确匹配
|
前缀
|
1
|
location = /image {}
|
^~
|
优先匹配
|
前缀
|
2
|
location ^~ /page {}
|
@
|
内部重定向
|
前缀
|
3
|
location @name {}
|
空 /
|
通用匹配
|
前缀
|
4
|
location / {}
|
使用原则:
前提:根据请求
url
,获取
uri
即除了域名
/IP
之外的部分,用于
location
匹配
如果有精确匹配,即
=/
路径,找到匹配项后,结束匹配。
location =
路径
{}
或者
location
完整路径
{}
如果有优先匹配,即
^~
,找到匹配项后,结束匹配。
location ^~
路径
如果有正则匹配,即
~|!~|~*|!~*
,找到匹配项后,不会终止继续匹配,直到找到合适的
location ~*
正则字符
{}
如果匹配到多个,则使用
location_match
最长的。
匹配示例
常见示例:
location = / { location ~ \.(gif|jpg|png|js|css)$ { location !~* \.xhtml$ {
#精确规则A #正则规则D #正则规则G
} } }
location = /login { location ~* \.png$ { location / {
#精确规则B #正则规则E #通用规则H
} } }
location ^~ /static/ { location !~ \.xhtml$ {
#优先规则C #正则规则F
} }
访问效果如下:
访问根目录/, 比如http://a.com/ 将匹配规则A
访问 http://a.com/login 将匹配规则B
访问 http://a.com/static/a.html 将匹配规则C
访问 http://a.com/a.gif, http://a.com/b.png 规则D和E均适合,按顺序优先使用规则D,而 http://a.com/static/c.png 则优先匹配到规则C
访问 http://a.com/a.PNG 则匹配规则E,因为规则E不区分大小写。
访问 http://a.com/a.XHTML 使用规则F。
访问 http://a.com/category/id/1111 则最终匹配到规则H。
@name
示例
@用来定义一个命名location。主要用于内部重定向,不能用来处理正常的请求。其用法如下:
location / {
try_files $uri $uri/ @custom
}
location @custom {
# ...do something
# custom 命名的 location中不能再嵌套其它的命名location
}
关于
URL
尾部的
/
有如下注意事项:
1 location
中的
location_match
字符有无
"/"
不受影响。
/user/
等同
/user
。
URL
尾部的
"/"
表示目录,没有
"/"
表示文件,而且文件找不到的话,会发生重定向。
/other/
:表示服务器会自动去该目录下找对应的默认文件。
/other
:表示服务器会先去找
other
文件,找不到的话会将
other
当成目录,重定向到
/other/
,去该目录下找默认文件。
location
常见动作:
在
location
内部常用的功能属性非常多,常见的基本属性、临时跳转、访问控制、目录列表等。
基本属性
基本属性
location / {
root /var/www/html; # 指定响应请求的文件所在路径
index index.php index.html index.htm; # 指定响应请求的默认文件名称
expires 7d; # 指定响应请求的文件过期时间,一般用于静态文件
try_files $uri $uri/ =404; # 如果root指定的路径下有查找的文件,就返回,否则报错
}
临时跳转
location = /test/ {
return 302 http://sswang.com/; # 访问旧url的时候,临时跳转到新url,两个url均不失效
}
访问控制
location /nginx-status {
stub_status on; # 开启nginx的状态页面,默认关闭
allow 192.168.8.14; # 允许的访问地址
deny all; # 默认进制所有访问
}
注意:
该功能依赖于ngx_http_stub_status_module 模块(默认没有安装,需要定制化安装)
目录列表
location /upload {
alias /var/www/upload; # 指定查看文件列表路径(绝对路径)
autoindex on; # 开启目录自动索引
autoindex_exact_size off; # 默认on,显示文件确切大小(bytes)。off表示显示文件的大概大小(kB/MB/...)
autoindex_localtime on; # 默认off,显示的文件时间为GMT时间。on表示显示文件的服务器时间
}
注意:
该alias指定的目录下,不允许出现index属性指定的文件。
root VS alias
root
和
alias
所起的作用都是指定响应请求所用文件的路径,只是他们有些许的区别
root
表示
location
匹配内容的相对路径
alias
表示
一个绝对路径
,
而且必须以
"/"
结尾
一般情况下,在
location /
中配置
root
,在
location /other
中配置
alias
效果一: 效果二:
location /img/ { location /img/ {
alias /var/www/image/; root /var/www/image;
}
效果一:访问http://localhost/img/,nginx找/var/www/image/目录下的文件
效果二:访问http://localhost/img/,nginx找/var/www/image/img/目录下的文件
location
核心动作
Nginx
的配置语法灵活,可控制度非常高。在
0.7
以后的版本中加入了一个
try_files
指令,配合命名
location
,可以部分替代原本常用的
rewrite
配置方式,提高解析效率。
指令语法
try_files file ... uri
try_files file ... =code
作用:
响应时按顺序查找file,找到则返回file内容,否则的话进行内部重定向(uri)或返回状态码(code)。
常见示例
如果能找到指定的uri那么就返回相应的内容,否则的话返回错误状态码404
try_files $uri $uri/ =404;
如果能找到指定的文件1/2.html那么就返回相应的内容,否则的话返回6.html文件内容
try_files 1.html 2.html /6.html;
如果能找到指定的uri那么就返回相应的内容,否则的话就内部重定向到后端名称为@backup的location
try_files $uri @backup;
注意:
如果最后一个地址是一个uri的话,那么这个uri必须是存在的,否则的话就出事了